package com.sunny.design.composite.demo.safe;

import java.util.ArrayList;
import java.util.List;

/**
 * 组合模式（Composite Pattern）
 *  组合模式也称为整体-部分（Part-Whole）模式
 *  它的宗旨是通过将单个对象（叶子节点）和组合对象（树枝节点）用相同的接口进行表示，使得客户对单个对象和组合对象的使用具有一致性
 *  属于结构型模式
 *
 * 组合模式包含 3 个角色：
 *  抽象根节点（Component）：定义系统各层次对象的共有方法和属性，可以预先定义一些默认行为和属性；
 *  树枝节点（Composite）：定义树枝节点的行为，存储子节点，组合树枝节点和叶子节点形成一个树形结构；
 *  叶子节点（Leaf）：叶子节点对象，其下再无分支，是系统层次遍历的最小单位。
 *
 * 适用场景
 *  希望客户端可以忽略组合对象与单个对象的差异时；
 *  对象层次具备整体和部分，呈树形结构。
 *
 * 优点
 *  清楚地定义分层次的复杂对象，表示对象的全部或部分层次
 *  让客户端忽略了层次的差异，方便对整个层次结构进行控制
 *  简化客户端代码
 *  符合开闭原则
 *
 * 缺点
 *  限制类型时会较为复杂
 *  使设计变得更加抽象
 */
public class Folder extends Directory {
    private List<Directory> dirs;

    private Integer level;

    public Folder(String name,Integer level) {
        super(name);
        this.level = level;
        this.dirs = new ArrayList<Directory>();
    }

    @Override
    public void show() {
        System.out.println(this.name);
        for (Directory dir : this.dirs) {
            //控制显示格式
            if(this.level != null){
                for(int  i = 0; i < this.level; i ++){
                    //打印空格控制格式
                    System.out.print("  ");
                }
                for(int  i = 0; i < this.level; i ++){
                    //每一行开始打印一个+号
                    if(i == 0){ System.out.print("+"); }
                    System.out.print("-");
                }
            }
            //打印名称
            dir.show();
        }
    }

    public boolean add(Directory dir) {
        return this.dirs.add(dir);
    }

    public boolean remove(Directory dir) {
        return this.dirs.remove(dir);
    }

    public Directory get(int index) {
        return this.dirs.get(index);
    }

    public void list(){
        for (Directory dir : this.dirs) {
            System.out.println(dir.name);
        }
    }

}